package funcSless

import (
	"time"

	"gitee.com/wchpub/fnsvr"
	"github.com/redis/go-redis/v9"
)

type FuncSlessDataSyncEnv struct {
	//redis数据库连接
	Redis *redis.Client

	//mongo数据库连接
	Mongo *fnsvr.Mogo
}

// 数据存取请求上下文
type FuncSlessEnv struct {
	FuncSlessDataSyncEnv

	//缺省的版本值
	DefaultVer int64

	//数据过期时间
	DataExpireTime time.Duration

	//游戏块定义
	BlockDefine map[string]struct{}

	//互斥锁最大等待时长
	LockMaxWait time.Duration

	//可被调用的全部函数
	FuncMap map[int32]SlessFunc
}

// 初始化funcSless,服务初始化时调用，运行时不可更改，非线程安全
func InitFuncSless(env FuncSlessEnv) {
	gFuncSlessEnv = env

}

// 启动数据同步协程，一个世界仅需要启动一个
// StopCh 协程停止管道，当被关闭时，协程会退出
// stopEndCh 协程退出时管道关闭，用于通知调用者协程退出完毕
// DataSyncIntervalTime 数据同步间隔时间
func StartDataSyncCo(
	env FuncSlessDataSyncEnv,
	DataSyncIntervalTime time.Duration,
	StopCh, stopEndCh chan struct{},
) {
	gFuncSlessEnv.FuncSlessDataSyncEnv = env

	//启动脏数据同步协程
	go fnsvr.GoSafeLoop(
		"funcSlessDataSync",
		dataSyncCo,
		DataSyncIntervalTime,
		StopCh,
		stopEndCh,
	)
}

var gFuncSlessEnv FuncSlessEnv
